/** * Para operar via 3ds na safra * dentro de function para manter variáveis privadas */ function Threeds(formId, orderId, callback) { /* Namespace */ const Threeds = {}; /** * @type {string} Qual form irá usar de base para informações de pagamento */ const _formElement = document.querySelector(formId); /** * @type {number} order Id para passar para endpoints */ const _orderId = orderId; /** * @type {string} Form element ddc a ser enviado */ const _ddcForm = document.querySelector('#ddc-form'); /** * Primeiro jwt a ser preenchido, ddc form */ const _ddcJwtEl = document.querySelector('#jwt2'); /** * Jwt do modal */ const _modalJwt = document.querySelector('#jwt'); /** * Form da modal */ const _modalForm = document.querySelector('#step-up-form'); /** * Iframe da modal */ const _modalIframe = document.querySelector('#step-up-iframe'); /** * @type {jQuery} elemento jquery da modal */ const _modalElement = $('#3ds-modal'); /** * Começa uma transação 3ds * @param {function} callback */ Threeds.start = function startThreeDs() { const formData = new FormData(_formElement); ajaxLoader.ajaxStart(); fetch('/payment/three-ds?order=' + _orderId, { method: "POST", body: formData, }) .then( (response) => response.json() ) .then( (json) => { ajaxLoader.ajaxStop(); if(json.status == false){ if(typeof json.redirect !== 'undefined'){ window.location.replace(json.redirect); return; } Threeds.finish('setup', true, json.message); return; } const jwtToken = json.accessToken; const chargeId = json.chargeId; const authAccessToken = json.authAccessToken; const authenticationId = json.cardholderAuthenticationId; // Com o jwt recebido _ddcJwtEl.value = jwtToken; // Envia o form _ddcForm.submit(); // Valida response if( !authAccessToken || !authenticationId || !chargeId || !jwtToken) { Threeds.finish('setup', true, 'invalid response'); return; } // Set-up do listener, valida message do iframe window.addEventListener("message", (event) => { // Valida url if (event.origin.includes('centinelapi')) { let data = JSON.parse(event.data); if (data !== undefined && data.Status) { console.log("Device Data Collection - success"); Threeds.enroll(authAccessToken, chargeId, authenticationId); } } },{ passive: true, once: true }); }) .catch( (error) => { console.error(error); Threeds.finish('setup', true, 'Ocorreu um erro no pagamento: 05-Setup'); }); }; /** * Processa enroll * @param {string} token * @param {string} chargeId * @param {string} authenticationId - cardholderAuthenticationId para caso de pagar direto */ Threeds.enroll = function enrollThreeDs(token, chargeId, authenticationId) { const formData = new FormData(_formElement); formData.append('httpBrowserJavaEnabled', window.navigator.javaEnabled()); formData.append('httpBrowserJavaScriptEnabled', true); formData.append('httpBrowserColorDepth', window.screen.colorDepth); formData.append('httpBrowserScreenHeight', screen.width); formData.append('httpBrowserScreenWidth', screen.height); formData.append('httpBrowserTimeDifference', new Date().getTimezoneOffset()); formData.append('authAccessToken', token); formData.append('chargeId', chargeId); formData.append('cardholderAuthenticationId', authenticationId); ajaxLoader.ajaxStart(); fetch('/payment/three-ds-enrollment?order=' + _orderId, { method: 'POST', body: formData, }) .then( (response) => response.json() ) .then( (json) => { ajaxLoader.ajaxStop(); const authStatus = json.message; // Já pagou if(typeof json.redirect !== 'undefined'){ window.location.replace(json.redirect); return; } if( json.status ) { Threeds.finish('enroll', false, json); } else { if (authStatus === 'Challenged') { localStorage.setItem('chargeId', json.chargeId); localStorage.setItem('accessToken', json.accessToken); localStorage.setItem('authAccessToken', token ); Threeds.openChallengeModal(json.accessToken, json.stepUpUrl); if(typeof json.endtime !== 'undefined') { let $cartCountDown = $('#cart-countdown'); let $newCountDown = $cartCountDown.clone(); $newCountDown.insertAfter( $cartCountDown ); $newCountDown.attr('id', 'cart-countdown-update'); $newCountDown.attr('data-endtime', json.endtime); $newCountDown.registerCountdown(function(){ payments.ExpireOrder(json.orderId); }); $cartCountDown.remove(); } return; } Threeds.finish('enroll', true, json.errorMessage || json.message); } }) .catch( (error) => { console.error(error); Threeds.finish('enroll', true, 'Ocorreu um erro no pagamento: 08-Enroll'); }); }; Threeds.iFrameCheck = function iFrameCheckClosure() { let iframe_url_count = 0; let iframe_timer_check = null; return function iframeCheck() { // Reseta agora, caso já tenha outro iframe_url_count = 0; // Aumenta contagem _modalIframe.onload = () => { if( ++iframe_url_count >= 3 ) { // Envia para back Threeds.pay(); // Remove timer já que vai enviar if( iframe_timer_check ) { clearTimeout(iframe_timer_check); iframe_timer_check = null; } } }; // Remove timer já que vai resetar if( iframe_timer_check ) { clearTimeout(iframe_timer_check); } /*iframe_timer_check = setTimeout( () => { // Envia tambem Threeds.pay(); }, 60000);*/ }; }(); Threeds.openChallengeModal = function openChallengeModal(token) { // Seta _modalJwt.value = token; // Envia este form _modalForm.submit(); // Abre modal _modalElement.modal('show'); Threeds.iFrameCheck(); }; /** * Payment */ Threeds.pay = function payThreeDs() { const formData = new FormData(_formElement); formData.append('authAccessToken', localStorage.getItem('authAccessToken')); formData.append('chargeId', localStorage.getItem('chargeId')); ajaxLoader.ajaxStart(); _modalElement.modal('hide'); fetch('/payment/three-ds-pay?order=' + _orderId, { method: "POST", body: formData, }) .then( (response) => response.json() ) .then( (json) => { ajaxLoader.ajaxStop(); if(typeof json.redirect !== 'undefined'){ window.location.replace(json.redirect); return; } Threeds.finish('pay', !json.status, json.errorMessage || json.message); }) .catch( (error) => { console.error(error); Threeds.finish('pay', true, 'Ocorreu um erro no pagamento: 17-Pay'); }); }; /** * End, finaliza a transação e devolve */ Threeds.finish = function finish(state, error, data) { if( callback ) { callback(state, error, data); } _modalElement.modal('hide'); ajaxLoader.ajaxStop(); }; return Threeds; }